package com.briup.demo.Mapper;

import com.briup.demo.User;
import org.apache.ibatis.annotations.*;

import java.time.LocalDateTime;
import java.util.List;
// 在程序运行时 框架会自动生成接口的实现类对象，
// 并交给spring的IOC容器管理
@Mapper // 表示这个是MyBatis中的Mapper接口
public interface UserMapper {
    public void deleteByIdXML(Integer id);


    // 写sql语句 - 查询所有用户数据
    // @Select代表写的是select语句
    @Select("select * from t_user")
    public List<User> allUserList();

    // 根据id查询用户
    @Select("select id,name,phone,register_time as registerTime from t_user where id = #{id}")
    public User getById(Integer id);

    // 组合查询
    // 查询姓张的同学，性别女，
    // 注册时间2024年11月25日10:45:50之后的，2024年11月26日10:46:42之前
    // 结果降序
    @Select("select * from t_user " +
            "where name like '%${name}%' " +
            "and gender = ${gender} " +
            "and register_time between #{beginTime} and #{endTime} " +
            "order by register_time desc"
    )
    public List<User> getUserList
    (@Param("name") String name, @Param("gender") short gender,@Param("beginTime") LocalDateTime beginTime,@Param("endTime") LocalDateTime endTime);
//  @Select("SELECT * FROM t_user " +
//          "WHERE name LIKE CONCAT('%', #{name}, '%') " +
//          "AND gender = #{gender} " +
//          "AND register_time BETWEEN #{beginTime} AND #{endTime} " +
//          "ORDER BY register_time DESC"
//  )
//  List<User> getUserList(
//          @Param("name") String name,
//          @Param("gender") Short gender,
//          @Param("beginTime") LocalDateTime beginTime,
//          @Param("endTime") LocalDateTime endTime
//  );

    // 根据id删除用户
    @Delete("delete from t_user where id = #{id}")
    public void deleteById(Integer id);

    // 登录
    // 无法防止sql注入的
    // @Select("select * from t_user where username=${username} and
    // password=${password} ")
    // 可以预防sql注入
    @Select("select * from t_user where id=${id} and phone=${phone} ")
    public List<User> login(@Param("id") String id, @Param("phone") String phone);

    // 新增 - 注册 - 返回主键
    @Options(useGeneratedKeys = true, keyProperty = "id") // 要求返回主键 赋值给user对象的id属性上
    @Insert("insert into t_user (name,age,gender,phone,birthday,register_time) values (#{name},#{age},#{gender},#{phone},#{birthday},#{registerTime})")
    public void addUser(User user);

    // 编辑
    @Update("update t_user set name=#{name}, age=#{age}, gender=#{gender}, phone=#{phone} where id=#{id}")
    public void updateUser(User user);
}
